﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLMuestraCanal
    {
        #region Metodos
        /// <summary>
        /// Método devuelve lista muestra canal
        /// </summary>
        /// <returns></returns>
        public List<MuestraCanal> ListarMuestraCanal(int codigoCanal)
        {
            return Accesor.ListarMuestraCanal(codigoCanal);
        }

        /// <summary>
        /// Método devuelve lista muestra canal por codigo
        /// </summary>
        /// <returns></returns>
        public List<MuestraCanal> BuscarMuestraCanalPorcodigo(int codigoCanal, string codigoMuestraCanal)
        {
            return Accesor.BuscarMuestraCanalPorcodigo(codigoCanal, codigoMuestraCanal);
        }

        /// <summary>
        /// Método inserta una muestra canal
        /// </summary>
        /// <param name="muestraCanal"></param>
        /// <returns></returns>
        public string InsertarMuestraCanal(MuestraCanal muestraCanal)
        {
            string result = "Registrado";

            using (TransactionScope transaction = new TransactionScope())
            {
                int EsPermitidoLaDistancia = Accesor.ValidarDistanciaMuestraCanal(muestraCanal.CodigoCanal, muestraCanal.Hasta, muestraCanal.CodigoTipoControlCalidad);
                if (EsPermitidoLaDistancia != 0)
                {
                    result = "La muestra ingresado está fuera de rango de la Distancia de Canal.";
                    return result;
                }

                int interseccion = Accesor.ValidarInterseccionMuestraCanal(muestraCanal.CodigoCanal, muestraCanal.CodigoMuestraCanal, muestraCanal.Desde, muestraCanal.Hasta, muestraCanal.CodigoTipoControlCalidad);
                if (interseccion == 1)
                {
                    result = "Existe intersección entre las muestras.";
                    return result;
                }
                Accesor.InsertarMuestraCanal(muestraCanal);

                //Actualizar Estado de Codigo de Muestra como 2=Asociado
                DACodigoMuestra dacodigoMuestra = new DACodigoMuestra();
                var codigoMuestra = dacodigoMuestra.ObtenerCodigoMuestra(muestraCanal.CodigoMuestraCanal);
                if (codigoMuestra != null)
                {
                    codigoMuestra.CodigoEstado = 2; //ASOCIADO
                    dacodigoMuestra.ModificarCodigoMuestra(codigoMuestra);
                }

                transaction.Complete();
                return result;
            }
        }
        /// <summary>
        /// Método modifica una muestra canal
        /// </summary>
        /// <param name="MuestraCanal"></param>
        public string ModificarMuestraCanal(MuestraCanal muestraCanal)
        {
            string result = "Registrado";

            int EsPermitidoLaDistancia = Accesor.ValidarDistanciaMuestraCanal(muestraCanal.CodigoCanal, muestraCanal.Hasta, muestraCanal.CodigoTipoControlCalidad);
            if (EsPermitidoLaDistancia != 0)
            {
                result = "La muestra ingresado está fuera de rango de la Distancia de Canal.";
                return result;
            }

            int interseccion = Accesor.ValidarInterseccionMuestraCanal(muestraCanal.CodigoCanal, muestraCanal.CodigoMuestraCanal, muestraCanal.Desde, muestraCanal.Hasta, muestraCanal.CodigoTipoControlCalidad);
            if (interseccion == 1)
            {
                result = "Existe intersección entre las muestras.";
                return result;
            }

            var muestraCanaljeEdit = Accesor.ObtenerMuestraCanal(muestraCanal.CodigoMuestraCanal);
            muestraCanaljeEdit.Desde = muestraCanal.Desde;
            muestraCanaljeEdit.Hasta = muestraCanal.Hasta;
            muestraCanaljeEdit.CodigoGeologo = muestraCanal.CodigoGeologo;
            muestraCanaljeEdit.CodigoTomadorMuestra = muestraCanal.CodigoTomadorMuestra;
            muestraCanaljeEdit.Observacion = muestraCanal.Observacion;
            muestraCanaljeEdit.CodigoTipoControlCalidad = muestraCanal.CodigoTipoControlCalidad;
            muestraCanaljeEdit.CodigoMuestraCanalDuplicado = muestraCanal.CodigoMuestraCanalDuplicado;
            muestraCanaljeEdit.FechaEnvio = muestraCanal.FechaEnvio;
            Accesor.ModificarMuestraCanal(muestraCanaljeEdit);
            return result;
        }
        /// <summary>
        /// Método que elimina muestra canal
        /// </summary>
        /// <param name="MuestraCanal"></param>
        public void EliminarMuestraCanal(string codigoMuestraCanal)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                var muestraCanal = Accesor.ObtenerMuestraCanal(codigoMuestraCanal);
                Accesor.EliminarMuestraCanal(muestraCanal);

                //Actualizar Estado de Codigo de Muestra como 1=GENERADO
                DACodigoMuestra dacodigoMuestra = new DACodigoMuestra();
                var codigoMuestra = dacodigoMuestra.ObtenerCodigoMuestra(muestraCanal.CodigoMuestraCanal);
                if (codigoMuestra != null)
                {
                    codigoMuestra.CodigoEstado = 1; //GENERADO
                    dacodigoMuestra.ModificarCodigoMuestra(codigoMuestra);
                }

                transaction.Complete();
            }
        }
        /// <summary>
        /// Método obtener muestra mensaje por codigo
        /// </summary>
        /// <param name="codigoMuestraMensaje"></param>
        /// <returns></returns>
        public MuestraCanal ObtenerMuestraCanal(string codigoMuestraCanal)
        {
            return Accesor.ObtenerMuestraCanal(codigoMuestraCanal);
        }

        /// <summary>
        /// Devuelve lista de Muestras por canal
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <returns></returns>
        public List<buscarMuestraCanal_Result> BuscarMuestraCanal(int codigoCanal)
        {
            return Accesor.BuscarMuestraCanal(codigoCanal);
        }

        /// <summary>
        /// Método devuelve lista canal por codigos
        /// </summary>
        /// <returns></returns>
        public List<MuestraCanal> ListarMuestraCanalPorcodigos(List<string> codigoMuestraCanals)
        {
            return Accesor.ListarMuestraCanalPorcodigos(codigoMuestraCanals);
        }

        /// <summary>
        /// Validar Interseccion
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <param name="tipoAnalisis"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public int ValidarInterseccionMuestraCanal(int codigoCanal, string codigoMuestraCanal, double desde, double hasta, int codigoTipoControlCalidad)
        {
            return Accesor.ValidarInterseccionMuestraCanal(codigoCanal, codigoMuestraCanal, desde, hasta, codigoTipoControlCalidad);
        }

        /// <summary>
        /// Devuelve la lista para ComboBox, DropdownList, devuelve campos Value y Text
        /// </summary>
        /// <returns></returns>
        public List<ListItemString> ObtenerListItem(int codigoCanal)
        {

            var result = Accesor.ListarMuestraCanal(codigoCanal);
            return result
                .Select(x => new ListItemString { Value = x.CodigoMuestraCanal, Text = x.CodigoMuestraCanal }).ToList();

        }
        /// <summary>
        /// Método devuelve lista muestra sondaje por codigo de sondaje y tipo de calidad
        /// </summary>
        /// <returns></returns>
        public List<MuestraCanal> ListarMuestraSondajePorSondajeYTipoControlCalidad(int codigoCanal, int codigoTipoControlCalidad)
        {
            return Accesor.ListarMuestraSondajePorSondajeYTipoControlCalidad(codigoCanal, codigoTipoControlCalidad);
        }
        /// <summary>
        /// Devuelve la lista para ComboBox, DropdownList, devuelve campos Value y Text
        /// </summary>
        /// <returns></returns>
        public List<ListItemString> ObtenerListItem1(int codigoCanal, int codigoTipoControlCalidad)
        {

            var result = Accesor.ListarMuestraSondajePorSondajeYTipoControlCalidad(codigoCanal, codigoTipoControlCalidad);
            return result
                .Select(x => new ListItemString { Value = x.CodigoMuestraCanal, Text = x.CodigoMuestraCanal }).ToList();

        }
        /// <summary>
        /// Devuelve el ultimo Hasta
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public double ObtenerUltimoHasta(int codigoCanal)
        {
            return Accesor.ObtenerUltimoHasta(codigoCanal);
        }

        /// <summary>
        /// Finaliza muestras de canal
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <returns></returns>
        public string FinalizarMuestraCanal(int codigoCanal)
        {
            return Accesor.FinalizarMuestraCanal(codigoCanal);
        }
        #endregion

        #region Accesor
        private static DAMuestraCanal Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAMuestraCanal(); }
        }
        #endregion
    }
}
